/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agb.Modelo;

import agb.Conexion.Conexion;
import java.io.File;
import java.sql.*;
import java.util.Vector;

/**
 *
 * @author Inicial
 */
public class Archivos {
    private String nombre, descripcion, activo, grado, nivel;
    private int codNivelGrado, codArchivo, codPersona;

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the activo
     */
    public String getActivo() {
        return activo;
    }

    /**
     * @param activo the activo to set
     */
    public void setActivo(String activo) {
        this.activo = activo;
    }

    /**
     * @return the codNivelGrado
     */
    public int getCodNivelGrado() {
        return codNivelGrado;
    }

    /**
     * @param codNivelGrado the codNivelGrado to set
     */
    public void setCodNivelGrado(int codNivelGrado) {
        this.codNivelGrado = codNivelGrado;
    }

    /**
     * @return the codArchivo
     */
    public int getCodArchivo() {
        return codArchivo;
    }

    /**
     * @param codArchivo the codArchivo to set
     */
    public void setCodArchivo(int codArchivo) {
        this.codArchivo = codArchivo;
    }

    /**
     * @return the codPersona
     */
    public int getCodPersona() {
        return codPersona;
    }

    /**
     * @param codPersona the codPersona to set
     */
    public void setCodPersona(int codPersona) {
        this.codPersona = codPersona;
    }

       public static boolean registraArchivos( Archivos oArchivos){
        boolean rpta = false;
        Connection cn = null;
        PreparedStatement ps = null;
        String sql = "insert into archivos (cod_archivo, nombre_archivo, descripcion_archivo, activo, fecha_archivo, cod_persona, cod_nivel_grado) " +
                "VALUES (nextval('archivos_seq'), ?,?,'Y', current_date, ?,?)" ;
        try{
            cn = Conexion.getConexion();
            cn.setAutoCommit(false);
            ps = cn.prepareStatement(sql);
            ps.setString(1, oArchivos.getNombre());
            ps.setString(2, oArchivos.getDescripcion());
            ps.setInt(3, oArchivos.getCodPersona());
            ps.setInt(4, oArchivos.getCodNivelGrado());
            rpta = ps.executeUpdate()==1?true:false;
            if(rpta){
                Conexion.confirmarTransaccion(cn);
            }else{
                Conexion.anularTransaccion(cn);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return rpta;
    }

   public static boolean actualizaArchivos( Archivos oArchivos){
        boolean rpta = false;
        Connection cn = null;
        PreparedStatement ps = null;
        String sql = "UPDATE archivos SET     " +
                "descripcion_archivo = ?,     " +
                "activo = ?,     " +
                "fecha_archivo = current_date,     " +
                "cod_persona = ?,     " +
                "cod_nivel_grado = ?, " +
                "nombre_archivo = ? " +
                "WHERE cod_archivo = ?" ;
        try{
            cn = Conexion.getConexion();
            cn.setAutoCommit(false);
            ps = cn.prepareStatement(sql);            
            ps.setString(1, oArchivos.getDescripcion());
            ps.setString(2, "Y");
            ps.setInt(3, oArchivos.getCodPersona());
            ps.setInt(4, oArchivos.getCodNivelGrado());
            ps.setString(5, oArchivos.getNombre());
            ps.setInt(6, oArchivos.getCodArchivo());
            rpta = ps.executeUpdate()==1?true:false;
            if(rpta){
                Conexion.confirmarTransaccion(cn);
            }else{
                Conexion.anularTransaccion(cn);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return rpta;
    }

   public static boolean eliminaArchivos(int codArchivo, String nombreArchivo){
        boolean rpta = false;
        Connection cn = null;
        PreparedStatement ps = null;
        String sql = "DELETE FROM archivos " +
                "WHERE cod_archivo = ?" ;
        try{
            cn = Conexion.getConexion();
            cn.setAutoCommit(false);
            ps = cn.prepareStatement(sql);
            ps.setInt(1,codArchivo);
            rpta = ps.executeUpdate()==1?true:false;
            if(rpta){
                //File archivo = new File("C:\\PRUEBA\\" + nombreArchivo);
                System.out.println(nombreArchivo);
                File archivo = new File(File.separatorChar + "usr" + File.separatorChar + "tomcat" + File.separatorChar + "webapps" + File.separatorChar + "Imagenes"  + File.separatorChar + "archivos" + File.separatorChar + nombreArchivo);
                if(archivo.delete()){
                    System.out.println("elim");
                    Conexion.confirmarTransaccion(cn);
                }else{
                    System.out.println("no elim");
                    Conexion.confirmarTransaccion(cn);
                }
            }else{
                Conexion.anularTransaccion(cn);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return rpta;
    }

    public int numeroPaginasArchivos(int codNivelGrado){
        int cod = 0;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select ((count(*)-1)/10)+1 " +
                "from archivos a " +
                "where a.activo = 'Y' " +
                "and a.cod_nivel_grado = ? " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codNivelGrado);
            rs = ps.executeQuery();
            while(rs.next()){
               cod = rs.getInt(1);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return cod;
    }

   public static Vector<Archivos>  archivosGrado(int CodNivelGrado){
        Archivos oArchivos = null;
        Vector<Archivos> LArchivos = new Vector<Archivos>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT A.cod_archivo, " +
                "A.nombre_archivo, A.descripcion_archivo " +
                "FROM archivos A " +
                "INNER JOIN nivel_grado NG ON A.cod_nivel_grado = NG.cod_nivelgrado " +
                "WHERE NG.cod_nivelgrado = ? " +
                "ORDER BY A.fecha_archivo " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, CodNivelGrado);
            rs = ps.executeQuery();
            while(rs.next()){
                oArchivos = new Archivos();
                oArchivos.setCodArchivo(rs.getInt(1));
                oArchivos.setNombre(rs.getString(2));
                oArchivos.setDescripcion(rs.getString(3));
                LArchivos.add(oArchivos);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LArchivos;
    }

   public  Vector<Archivos>  listaArchivosPagina(int CodNivelGrado, int offset){
        Archivos oArchivos = null;
        Vector<Archivos> LArchivos = new Vector<Archivos>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT a.nombre_archivo, a.descripcion_archivo " +
                "FROM archivos a " +
                "where a.activo = 'Y' " +
                "and a.cod_nivel_grado = ? " +
                "order by a.cod_archivo " +
                "OFFSET ? " +
                "LIMIT 10 ";
                try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, CodNivelGrado);
            ps.setInt(2, offset);
            rs = ps.executeQuery();
            while(rs.next()){
                oArchivos = new Archivos();
                oArchivos.setNombre(rs.getString(1));
                oArchivos.setDescripcion(rs.getString(2));
                LArchivos.add(oArchivos);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LArchivos;
    }

   public  Vector<Archivos>  listaUltimosArchivosPagina(int CodNivelGrado){
        Archivos oArchivos = null;
        Vector<Archivos> LArchivos = new Vector<Archivos>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT a.nombre_archivo, a.descripcion_archivo " +
                "FROM archivos a " +
                "where a.activo = 'Y' " +
                "and a.cod_nivel_grado = ? " +
                "order by a.cod_archivo desc " +
                "limit 10";
                try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, CodNivelGrado);
            rs = ps.executeQuery();
            while(rs.next()){
                oArchivos = new Archivos();                
                oArchivos.setNombre(rs.getString(1));
                oArchivos.setDescripcion(rs.getString(2));
                LArchivos.add(oArchivos);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LArchivos;
    }

    public static Vector<Archivos>  archivosPersona(int codPersona){
        Archivos oArchivos = null;
        Vector<Archivos> LArchivos = new Vector<Archivos>();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT A.cod_archivo, A.nombre_archivo, A.descripcion_archivo, A.activo,  G.nombre, N.nombre " +
                "FROM archivos A " +
                "INNER JOIN nivel_grado NG ON A.cod_nivel_grado = NG.cod_nivelgrado " +
                "INNER JOIN grado G ON G.cod_grado = NG.cod_grado " +
                "INNER JOIN nivel N ON N.cod_nivel = NG.cod_nivel " +
                "INNER JOIN p_natural P ON P.cod_persona = A.cod_persona " +
                "WHERE P.cod_persona = ? " +
                "ORDER BY A.fecha_archivo " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codPersona);
            rs = ps.executeQuery();
            while(rs.next()){
                oArchivos = new Archivos();
                oArchivos.setCodArchivo(rs.getInt(1));
                oArchivos.setNombre(rs.getString(2));
                oArchivos.setDescripcion(rs.getString(3));
                oArchivos.setActivo(rs.getString(4));
                oArchivos.setGrado(rs.getString(5));
                oArchivos.setNivel(rs.getString(6));
                LArchivos.add(oArchivos);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return LArchivos;
    }

    public static Archivos  buscaArchivo(int codArchivo){
        Archivos oArchivos = new Archivos();
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT A.cod_archivo, A.nombre_archivo, A.descripcion_archivo, A.activo, A.cod_nivel_grado " +
                "FROM archivos A " +
                "INNER JOIN nivel_grado NG ON A.cod_nivel_grado = NG.cod_nivelgrado " +
                "INNER JOIN p_natural P ON P.cod_persona = A.cod_persona " +
                "WHERE A.cod_archivo = ? " +
                "ORDER BY A.fecha_archivo " ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, codArchivo);
            rs = ps.executeQuery();
            while(rs.next()){
                
                oArchivos.setCodArchivo(rs.getInt(1));
                oArchivos.setNombre(rs.getString(2));
                oArchivos.setDescripcion(rs.getString(3));
                oArchivos.setActivo(rs.getString(4));
                oArchivos.setCodNivelGrado(rs.getInt(5));

            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return oArchivos;
    }

    public static int  ultimoCodigo(){
        int cod = 0;
        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT " +
                "CASE WHEN MAX(cod_archivo) = 0 THEN 1 ELSE MAX(cod_archivo) END " +
                "FROM archivos" ;
        try{
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()){
               cod = rs.getInt(1);
            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        }catch(SQLException ex){
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return cod;
    }

    /**
     * @return the grado
     */
    public String getGrado() {
        return grado;
    }

    /**
     * @param grado the grado to set
     */
    public void setGrado(String grado) {
        this.grado = grado;
    }

    /**
     * @return the nivel
     */
    public String getNivel() {
        return nivel;
    }

    /**
     * @param nivel the nivel to set
     */
    public void setNivel(String nivel) {
        this.nivel = nivel;
    }
}
